package Lambda表达式.Lambda表达式和匿名内部类的区别;
/**
 *1.7 Lambda表达式和匿名内部类的区别
 * 所需类型不同
 * ●匿名内部类: 可以是接口，也可以是抽象类,还可以是具体类
 * ●Lambda表达式: 只能是接口
 *
 * 使用限制不同
 * ●如果接口中有且仅有一个抽象方法，可以使用Lambda表达式，也可以使用匿名内部类
 * ●如果接口中多 于一个抽象方法，只能使用匿名内部类，而不能使用Lambda表达式
 *
 * 实现原理不同
 * ●匿名内部类: 编译之后，产生一个单独的.class字节码文件
 * ●Lambda表达式: 编译之后，没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
 * */
public class LambdaDemo {
    public static void main(String[] args) {
        //匿名内部类，可以实现方法参数为可以是接口也可以是抽象了也可以是具体类的重写
        useInter(new Inter() {
            @Override
            public void show() {
                System.out.println("接口和抽象类");
            }
        });

        useAnimal(new Animal() {
            @Override
            public void method() {
                System.out.println("抽象");
            }
        });

        useStudent(new Student(){
            @Override
            public void study(){
                System.out.println("具体类");
            }
        });

        //Lambda，只能是接口，不能是抽象类和具体类
        useInter(()-> System.out.println("接口1"));
        /*useAnimal(()-> System.out.println("抽象类1"));
        useStudent(()-> System.out.println("具体类1"));*/



    }
    private static void useStudent(Student s){
        s.study();
    }
    private static void useAnimal(Animal a){
        a.method();
    }
    private static void useInter(Inter i){
        i.show();
    }
}
